#include <iostream>

class Elemento{
public:
  std::string nome;
  int prioridade;
  Elemento* proximo; 
  Elemento(std::string nome, int prioridade){
    this->nome = nome;
    this->prioridade = prioridade;
    this->proximo = nullptr; 
  }	   
};

class Fila{
public:
  Elemento *primeiro, *ultimo;
  Fila(){
    primeiro = ultimo = nullptr; 
  }
  void inserir(Elemento* novo){
    if(primeiro == nullptr)
      primeiro = ultimo = novo;
    else{
      ultimo->proximo = novo;
      ultimo = novo;
    }
  }
  void remover(){
    primeiro = primeiro->proximo; 
  }
  Elemento* espiar(){ 
    return primeiro; 
  }
};

int main(){
  Fila* fila = new Fila;
  fila->inserir(new Elemento("documento.odt", 2));
  fila->inserir(new Elemento("folder.pdf", 1));
  fila->inserir(new Elemento("planilha.ods", 1));
  fila->inserir(new Elemento("atividade.odt", 3));
  fila->inserir(new Elemento("apresentacao.odp", 2));
  
  Elemento* tmp = fila->espiar(); 
  
  while(tmp){
    if(tmp->prioridade == 3){
      std::cout << "Imprimindo: " << tmp->nome << " - prioridade: " << tmp->prioridade << std::endl;  
    }
    tmp = tmp->proximo; 
  }

  tmp = fila->espiar(); 
  
  while(tmp){
    if(tmp->prioridade == 2){
      std::cout << "Imprimindo: " << tmp->nome << " - prioridade: " << tmp->prioridade << std::endl; 
    }
    tmp = tmp->proximo; 
  }

  tmp = fila->espiar();
  
  while(tmp){
    if(tmp->prioridade == 1){
      std::cout << "Imprimindo: " << tmp->nome << " - prioridade: " << tmp->prioridade << std::endl;
    }
    tmp = tmp->proximo; 
  }
  
}
